[/
 / Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 /
 / Distributed under the Boost Software License, Version 1.0. (See accompanying
 / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 /]

[section:executors Executors]

Every asynchronous agent has an associated ['executor]. An agent's executor
determines how the agent's completion handlers are queued and ultimately run.

Example uses of executors include:

* Coordinating a group of asynchronous agents that operate on shared data
  structures, ensuring that the agents' completion handlers never run
  concurrently[footnote In Boost.Asio, this kind of executor is called a [link
  boost_asio.overview.core.strands strand].].

* Ensuring that agents are run on specified execution resource (e.g. a CPU)
  that is proximal to data or an event source (e.g. a NIC).

* Denoting a group of related agents, and so enabling dynamic thread pools to
  make smarter scheduling decisions (such as moving the agents between
  execution resources as a unit).

* Queuing all completion handlers to run on a GUI application thread, so that
  they may safely update user interface elements.

* Returning an asynchronous operation's default executor as-is, to run
  completion handlers as close as possible to the event that triggered the
  operation's completion.

* Adapting an asynchronous operation's default executor, to run code before and
  after every completion handler, such as logging, user authorisation, or
  exception handling.

* Specifying a priority for an asynchronous agent and its completion handlers.

The asynchronous operations within an asynchronous agent use the agent's
associated executor to:

* Track the existence of the work that the asynchronous operation represents,
  while the operation is outstanding.

* Enqueue the completion handler for execution on completion of an operation.

* Ensure that completion handlers do not run re-entrantly, if doing so might
  lead to inadvertent recursion and stack overflow.

Thus, an asynchronous agent's associated executor represents a policy of how,
where, and when the agent should run, specified as a cross-cutting concern to
the code that makes up the agent.

[endsect]
